#include "../config.h"

#include "strfuncs.h"

namespace gpyp {

void decode_html(const char *start, const char *end, Glib::ustring &res) {
  res.clear();
  if (!end) end = start + strlen(start);

  size_t len = end - start;
  res.reserve(len);
  const char* l = start;
  const char* s = NULL;
  for(const char* c = l; *c && c < end; ++c) {
    switch(*c) {
    case '&':
      if (!s) s = c;
      break;
    case ';':
      if (s) {
        const char* f = s + 1;
        size_t size = c - f;
        if (size == 3 && strncmp(f, "amp", size) == 0) {
          res.append(l, s);
          res += '&';
          l = c + 1;
        } else if (size == 4 && strncmp(f, "quot", size) == 0) {
          res.append(l, s);
          res += '"';
          l = c + 1;
        } else if (size == 4 && strncmp(f, "#039", size) == 0) {
          res.append(l, s);
          res += '\'';
          l = c + 1;
        } else if (size == 2 && strncmp(f, "lt", size) == 0) {
          res.append(l, s);
          res += '<';
          l = c + 1;
        } else if (size == 2 && strncmp(f, "gt", size) == 0) {
          res.append(l, s);
          res += '>';
          l = c + 1;
        }
        s = NULL;
      }
    }
  }
  res.append(l, end);
}
void encode_html(const Glib::ustring &str, Glib::ustring &res) {
  res.clear();
  res.reserve(str.bytes());
  const char* l = str.c_str();
  for(const char* chr = l; *chr; ++chr) {
    const char* rep = (*chr == '<' ? "&lt;" :
                       (*chr == '>' ? "&gt;" :
                        (*chr == '&' ? "&amp;" : NULL)));
    if (rep) {
      res.append(l, chr);
      res.append(rep);
      l = chr + 1;
    }
  }
  res.append(l);
}

}/* namespace gpyp */
